package br.com.ufpr.util.base;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.cycle.RequestCycle;

import br.com.sebrae.pr.sgp.entities.base.BasePersistente;
import br.com.sebrae.pr.sgp.util.exceptions.TipoErro;
import br.com.ufpr.sgp.util.session.CustomSession;
import br.com.ufpr.util.feedback.CustomFeedbackPanel;

import com.google.common.base.Preconditions;

/**
 * Página base para todas as páginas do sistema
 * 
 * @author Willian Tanaka
 */
public abstract class BasePage extends WebPage {
    private static final long serialVersionUID = -8061397205026997229L;

    public static final Logger log = Logger.getLogger(BasePage.class);

    private CustomFeedbackPanel cfp;

    public BasePage() {
        log.debug("Instanciando BasePage. Classe: " + this.getClass().getCanonicalName());
        montaBasePage();
    }

    private void montaBasePage() {
        cfp = new CustomFeedbackPanel("feedbackPanel");
        add(cfp);
    }

    /**
     * Obtém o AjaxRequestTarget, e adiciona à ele, o painel de feedback
     */
    public void atualizarFeedbackPanel(final AjaxRequestTarget target) {
        cfp.atualizaPanel(target);
    }

    /**
     * Obtém o AjaxRequestTarget, e adiciona à ele, o painel de feedback
     */
    public void atualizarFeedbackPanel() {
        cfp.atualizaPanel(RequestCycle.get().find(AjaxRequestTarget.class));
    }

    /**
     * Adiciona à lista de mensagens do painel de feedback, uma mensagem do tipo recebido como parametro
     * 
     * @param tipoErro
     * @param mensagem
     */
    public void adicionaMensagem(final TipoErro tipoErro, final String mensagem) {
        cfp.adicionaMensagem(tipoErro, mensagem);
    }

    /**
     * Adiciona à lista de mensagens do painel de feedback, uma mensagem de erro.
     * 
     * @param mensagem
     */
    public void adicionaMensagemErro(final String mensagem) {
        cfp.adicionaMensagem(TipoErro.ERRO, mensagem);
    }

    /**
     * Adiciona à lista de mensagens do painel de feedback, uma mensagem de sucesso.
     * 
     * @param mensagem
     */
    public void adicionaMensagemSucesso(final String mensagem) {
        cfp.adicionaMensagem(TipoErro.SUCESSO, mensagem);
    }

    protected void atualizar(final AjaxRequestTarget target) {

    }

    public void setFeedbackMessage(IModel<String> message, AjaxRequestTarget target) {
        if (message != null && StringUtils.isNotBlank(message.getObject())) {
            adicionaMensagemSucesso(message.getObject());
        }
    }

    public static boolean inclusao(final BasePersistente dto) {
        return dto.getId() == null || dto.getId() == 0;
    }

    public static boolean alteracao(final BasePersistente dto) {
        return dto.getId() != null && dto.getId() > 0;
    }

    public static boolean inclusao(final IModel<? extends BasePersistente> dtoModel) {
        return dtoModel != null && dtoModel.getObject() != null && inclusao(dtoModel.getObject());
    }

    public static boolean alteracao(final IModel<? extends BasePersistente> dtoModel) {
        return dtoModel != null && dtoModel.getObject() != null && alteracao(dtoModel.getObject());
    }

    public static void validaAgenteLogado(final BasePersistente dto) {
        Preconditions.checkNotNull(dto.getUsuarioLogado(), "Usuário logado é obrigatório");
        Preconditions.checkArgument(dto.getUsuarioLogado().getId() != null && dto.getUsuarioLogado().getId() > 0,
                "Usuário logado é obrigatório");
    }

    protected void setUsuarioLogadoDto(final IModel<? extends BasePersistente> model) {
        model.getObject().setUsuarioLogado(CustomSession.get().getUsuario());
    }

    protected void setUsuarioLogadoDto(final BasePersistente dto) {
        dto.setUsuarioLogado(CustomSession.get().getUsuario());
    }
}
